aboutsummaryrefslogtreecommitdiffstats
path: root/apps/web/app/api/assets/[assetId]
diff options
context:
space:
mode:
authorMohamed Bassem <me@mbassem.com>2025-05-18 16:58:08 +0100
committerGitHub <noreply@github.com>2025-05-18 16:58:08 +0100
commit3505cb7d6416d101a4fcb1be27fc22e0171bacd2 (patch)
treeef9f55504b8a5b20add8c0ebe916972ab4ab0178 /apps/web/app/api/assets/[assetId]
parent74e74fa6425f072107de3a9bc9dd8f91c5ac9a7d (diff)
downloadkarakeep-3505cb7d6416d101a4fcb1be27fc22e0171bacd2.tar.zst
refactor: Migrate from NextJs's API routes to Hono based routes for the API (#1432)
* Setup Hono and migrate the highlights API there * Implement the tags and lists endpoint * Implement the bookmarks and users endpoints * Add the trpc error code adapter * Remove the old nextjs handlers * fix api key not found handling * Fix trpc error handling * Fix 204 handling * Fix search ordering * Implement the singlefile endpoint * Implement the asset serving endpoints * Implement webauth * Add hono as a catch all route under api * fix tests
Diffstat (limited to 'apps/web/app/api/assets/[assetId]')
-rw-r--r--apps/web/app/api/assets/[assetId]/route.ts85
1 files changed, 0 insertions, 85 deletions
diff --git a/apps/web/app/api/assets/[assetId]/route.ts b/apps/web/app/api/assets/[assetId]/route.ts
deleted file mode 100644
index 8abb9080..00000000
--- a/apps/web/app/api/assets/[assetId]/route.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-import { createContextFromRequest } from "@/server/api/client";
-import { and, eq } from "drizzle-orm";
-
-import { assets } from "@karakeep/db/schema";
-import {
- createAssetReadStream,
- getAssetSize,
- readAssetMetadata,
-} from "@karakeep/shared/assetdb";
-
-export const dynamic = "force-dynamic";
-export async function GET(
- request: Request,
- { params }: { params: { assetId: string } },
-) {
- const ctx = await createContextFromRequest(request);
- if (!ctx.user) {
- return Response.json({ error: "Unauthorized" }, { status: 401 });
- }
-
- const assetDb = await ctx.db.query.assets.findFirst({
- where: and(eq(assets.id, params.assetId), eq(assets.userId, ctx.user.id)),
- });
-
- if (!assetDb) {
- return Response.json({ error: "Asset not found" }, { status: 404 });
- }
-
- const [metadata, size] = await Promise.all([
- readAssetMetadata({
- userId: ctx.user.id,
- assetId: params.assetId,
- }),
-
- getAssetSize({
- userId: ctx.user.id,
- assetId: params.assetId,
- }),
- ]);
-
- const range = request.headers.get("Range");
- if (range) {
- const parts = range.replace(/bytes=/, "").split("-");
- const start = parseInt(parts[0], 10);
- const end = parts[1] ? parseInt(parts[1], 10) : size - 1;
-
- const stream = createAssetReadStream({
- userId: ctx.user.id,
- assetId: params.assetId,
- start,
- end,
- });
-
- return new Response(
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
- stream as any,
- {
- status: 206, // Partial Content
- headers: {
- "Content-Range": `bytes ${start}-${end}/${size}`,
- "Accept-Ranges": "bytes",
- "Content-Length": (end - start + 1).toString(),
- "Content-type": metadata.contentType,
- },
- },
- );
- } else {
- const stream = createAssetReadStream({
- userId: ctx.user.id,
- assetId: params.assetId,
- });
-
- return new Response(
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any
- stream as any,
- {
- status: 200,
- headers: {
- "Content-Length": size.toString(),
- "Content-type": metadata.contentType,
- },
- },
- );
- }
-}